home *** CD-ROM | disk | FTP | other *** search
- IDT 'FFT4'
- *
- * Cooley-Tukey Radix-4, DIF FFT Program
- *
- * Single radix-4 butterfly.
- * Complex input data - size limited only by program memory availability.
- * Uses table lookup of twiddle factors.
- * No scaling is done on intermediate values in the program.
- * External data RAM is addressed via peripheral I/O instructions.
- * An address counter is required and is loaded by a write
- * to port 0. Data is read from and written to port 1.
- * Data in the external RAM assumes complex data with corresponding
- * real and imaginary data values in consecutive locations.
- *
- * N is the size of the transform (N = 4**M).
- N EQU 64
- M EQU 3
- *
- * Data memory allocation.
- *
- XI EQU 0 * Data values for butterfly
- YI EQU 1
- XI1 EQU 2
- YI1 EQU 3
- XI2 EQU 4
- YI2 EQU 5
- XI3 EQU 6
- YI3 EQU 7
- I EQU 8 * Data indices
- I1 EQU 9
- I2 EQU 10
- I3 EQU 11
- CO1 EQU 12 * Twiddle factor coefficients
- CO2 EQU 13
- CO3 EQU 14
- SI1 EQU 15
- SI2 EQU 16
- SI3 EQU 17
- N1 EQU 18 * Increment to I
- N2 EQU 19 * Index separation
- IA EQU 20 * Index to twiddle factors
- IE EQU 21 * Increment to IA
- J EQU 22 * Counters
- K EQU 23
- R1 EQU 24 * Temporaries
- R2 EQU 25
- S1 EQU 26
- S2 EQU 27
- R3 EQU 28
- R4 EQU 29
- S3 EQU 30
- S4 EQU 31
- XJ EQU 32
- YJ EQU 33
- TEMP EQU 34
- HOLDN EQU 35 * Contains the value N
- QUARTN EQU 36 * Contains the value N/4
- ONE EQU 37 * Contains the value 1
- TABLE EQU 38 * Location of coefficient table
- *
- * Begin program memory section.
- *
- AORG 0
- START LDPK 0
- LACK 1
- SACL IE * Initialize IE = 1
- SACL ONE
- LT ONE
- MPYK SINE
- PAC
- SACL TABLE * Save address of coefficient table
- MPYK N
- PAC
- SACL HOLDN
- SACL N2 * Initialize N2 = N
- LAC HOLDN,14
- SACH QUARTN * QUARTN = N/4
- LARK AR0,M-1 * AR0 contains K value
- KLOOP LARP 1
- LAC N2
- SACL N1 * N1 = N2
- LAC N2,14
- SACH N2 * N2 = N2/4
- ZAC
- SACL J
- SACL IA
- LAR AR1,N2 * AR1 contains J value
- MAR *- * Start at N2-1
- JLOOP LAC TABLE
- ADD IA
- TBLR SI1 * Get twiddle factor 1
- ADD QUARTN
- TBLR CO1
- LAC TABLE
- ADD IA,1
- TBLR SI2 * Get twiddle factor 2
- ADD QUARTN
- TBLR CO2
- LAC TABLE
- ADD IA,1
- ADD IA
- TBLR SI3 * Get twiddle factor 3
- ADD QUARTN
- TBLR CO3
- LAC IA
- ADD IE
- SACL IA * IA = IA + IE
- LAC J,1
- SACL I * I = J (data organized ar real value followed
- * * by imaginary so address I is 2 times J).
- ILOOP LAC I
- ADD N2,1
- SACL I1 * I1 = I + N2
- ADD N2,1
- SACL I2 * I2 = I1 + N2
- ADD N2,1
- SACL I3 * I3 = I2 + N2
- *
- OUT I,PA0 * Output address of XI
- IN XI,PA1 * Read real and imaginary parts
- IN YI,PA1
- OUT I1,PA0 * Output address of XI1
- IN XI1,PA1 * Read real and imaginary parts
- IN YI1,PA1
- OUT I2,PA0 * Output address of XI2
- IN XI2,PA1 * Read real and imaginary parts
- IN YI2,PA1
- OUT I3,PA0 * Output address of XI3
- IN XI3,PA1 * Read real and imaginary parts
- IN YI3,PA1
- *
- * Compute butterfly.
- *
- LAC XI
- ADD XI2
- SACL R1 * R1 = X(I) + X(I2)
- SUB XI2,1
- SACL R3 * R3 = X(I) - X(I2)
- LAC YI
- ADD YI2
- SACL S1 * S1 = Y(I) + Y(I2)
- SUB YI2,1
- SACL S3 * S3 = Y(I) - Y(I2)
- LAC XI1
- ADD XI3
- SACL R2 * R2 = X(I1) + X(I3)
- SUB XI3,1
- SACL R4 * R4 = X(I1) - X(I3)
- LAC YI1
- ADD YI3
- SACL S2 * S2 = Y(I1) + Y(I3)
- SUB YI3,1
- SACL S4 * S4 = Y(I1) - Y(I3)
- *
- LAC R1
- ADD R2
- SACL XI * X(I) = R1 + R2
- SUB R2,1
- SACL R2 * R2 = R1 - R2
- LAC R3
- SUB S4
- SACL R1 * R1 = R3 - S4
- ADD S4,1
- SACL R3 * R3 = R3 + S4
- *
- LAC S1
- ADD S2
- SACL YI * Y(I) = S1 + S2
- SUB S2,1
- SACL S2 * S2 = S1 - S2
- LAC S3
- ADD R4
- SACL S1 * S1 = S3 + R4
- SUB R4,1
- SACL S3 * S3 = S3 - R4
- *
- LT CO1
- MPY S3
- PAC
- LT SI1
- MPY R3
- SPAC
- SACH YI1,1 * Y(I1) = CO1*S3 - SI1*R3
- MPY S3
- PAC
- LT CO1
- MPY R3
- LTA CO2
- SACH XI1,1 * X(I1) = CO1*R3 + SI1*S3
- MPY S2
- PAC
- LT SI2
- MPY R2
- SPAC
- SACH YI2,1 * Y(I2) = CO2*S2 - SI2*R2
- MPY S2
- PAC
- LT CO2
- MPY R2
- LTA CO3
- SACH XI2,1 * X(I2) = CO2*R2 + SI2*S2
- MPY S1
- PAC
- LT SI3
- MPY R1
- SPAC
- SACH YI3,1 * Y(I3) = CO3*S1 - SI3*R1
- MPY S1
- PAC
- LT CO3
- MPY R1
- APAC
- SACH XI3,1 * X(I3) = CO3*R1 + SI3*S1
- *
- * Output results of the butterfly.
- *
- OUT I,PA0
- OUT XI,PA1
- OUT YI,PA1
- OUT I1,PA0
- OUT XI1,PA1
- OUT YI1,PA1
- OUT I2,PA0
- OUT XI2,PA1
- OUT YI2,PA1
- OUT I3,PA0
- OUT XI3,PA1
- OUT YI3,PA1
- *
- * Add increment for next loop.
- *
- LAC I
- ADD N1,1
- SACL I * I = I + N1
- SUB HOLDN,1
- BLZ ILOOP
- LAC J
- ADD ONE
- SACL J * J = J + 1
- BANZ JLOOP
- LAC IE,2
- SACL IE * IE = IE*4
- LARP 0
- BANZ KLOOP
- *
- * Digit reverse counter for radix-4 FFT computation.
- *
- DRC4 ZAC
- SACL J
- SACL I
- LARP 0
- LAR AR0,HOLDN
- MAR *-
- MAR *-
- DRLOOP SUB J
- BGEZ NOSWAP
- *
- * Swap I and J locations.
- *
- OUT I,PA0
- IN XI,PA1
- IN YI,PA1
- OUT J,PA0
- IN XJ,PA1
- IN YJ,PA1
- OUT J,PA0
- OUT XI,PA1
- OUT YI,PA1
- OUT I,PA0
- OUT XJ,PA1
- OUT YJ,PA1
- NOSWAP LAC QUARTN,1
- SACL K
- INLOOP LT K
- MPYK 3
- PAC
- SACL TEMP
- SUB J
- BGZ OUTL
- LAC J
- SUB TEMP
- SACL J
- LAC K,14
- SACH K
- B INLOOP
- OUTL LAC J
- ADD K
- SACL J
- LAC I
- ADD ONE,1
- SACL I
- BANZ DRLOOP
- *
- * End of FFT.
- *
- STOP B STOP
- *
- * Sine and cosine tables for coefficients.
- *
- SINE EQU $
- DATA 0
- DATA 3211
- DATA 6392
- DATA 9511
- DATA 12539
- DATA 15446
- DATA 18204
- DATA 20787
- DATA 23169
- DATA 25329
- DATA 27244
- DATA 28897
- DATA 30272
- DATA 31356
- DATA 32137
- DATA 32609
- COSINE EQU $
- DATA 32767
- DATA 32609
- DATA 32137
- DATA 31356
- DATA 30272
- DATA 28897
- DATA 27244
- DATA 25329
- DATA 23169
- DATA 20787
- DATA 18204
- DATA 15446
- DATA 12539
- DATA 9511
- DATA 6392
- DATA 3211
- DATA 0
- DATA -3211
- DATA -6392
- DATA -9511
- DATA -12539
- DATA -15446
- DATA -18204
- DATA -20787
- DATA -23169
- DATA -25329
- DATA -27244
- DATA -28897
- DATA -30272
- DATA -31356
- DATA -32137
- DATA -32609
- DATA -32767
- DATA -32609
- DATA -32137
- DATA -31356
- DATA -30272
- DATA -28897
- DATA -27244
- DATA -25329
- DATA -23169
- DATA -20787
- DATA -18204
- DATA -15446
- DATA -12539
- DATA -9511
- DATA -6392
- DATA -3211
- END